module app.middleware.CheckTokenMiddleware;

import hunt.framework;
import app.response.ResultMsg;
import app.utils.RespCodeEnun;

/**
* 检查token有效性的中间件
*
* 使用方法：
* 1. 在controller构造函数中注册
* class AdminController : Controller {
*     this() {
*     	this.addMiddleware(new CheckTokenMiddleware());
*     }
* }
*
* 2. 在main函数中使用
* Application app = Application.instance();
*     app.onBooted(() {
*         app.route().group("admin").withMiddleware(CheckTokenMiddleware.stringof);
*         app.route().group("admin").get("index.test").withoutMiddleware(CheckTokenMiddleware.stringof);
*     });
*
* 3. 在action上使用注解
* class IndexController : Controller {
*     @Middleware(AuthMiddleware.stringof)
*     @Action string secret() {
*         return "It's a secret page.";
*     }
* 
*     @WithoutMiddleware(AuthMiddleware.stringof)
*     @Action Response login(LoginUser user) {
*         // do something
*     }
* }
*
* 不通过返回错误信息，通过继续向下传递
*/
class CheckTokenMiddleware : AbstractMiddleware
{
    shared static this()
    {
        MiddlewareInterface.register!(typeof(this));
    }

    /**
     * 检查token有效性，不通过返回错误信息，通过继续传递
     *
     * @return Response
     */
    Response onProcess(Request req, Response resp)
    {
        import std.string : strip;
        import hunt.jwt : JwtToken;
        import app.utils.Const;

        // 获取请求头中的token值
        string encodedToken = req.bearerToken();
        if (encodedToken is null || strip(encodedToken) == "")
        {
            return new JsonResponse(new ResultMsg(RespCodeEnun.Forbidden, "token不存在"));
        }
        // 验证token
        bool isOk = JwtToken.verify(encodedToken, Const.secret);
        if (!isOk) // 验证失败
        {
            return new JsonResponse(new ResultMsg(RespCodeEnun.Forbidden, "token验证失败"));
        }

        // 验证通过，请求继续传递
        return null;
    }
}
